// Extensão ajax para jProton.
jProton.extend({

  '@extension': {'ajax': '0.2.0a'},

  /**#@+
   * @function
   * @memberOf jProton
   * @extends ajax
   */

  /**
   * Serializa.
   * 
   * @name serialize
   * @param {Object} data Desc
   */
  serialize: function(data) {
    var r = [''], rl = 0;
    if (data) {
      if (typeof data == 'string')  r[rl++] = data
        
      else if (data.innerHTML && data.elements) {
        for (var i=0,el,l=(el=data.elements).length; i < l; i++)
          if (el[i].name) {
            r[rl++] = encodeURIComponent(el[i].name); 
            r[rl++] = '=';
            r[rl++] = encodeURIComponent(el[i].value);
            r[rl++] = '&';
          }
            
      } else 
        for(param in data) {
          r[rl++] = encodeURIComponent(param); 
          r[rl++] = '=';
          r[rl++] = encodeURIComponent(data[param]);
          r[rl++] = '&';
        }
    }
    return r.join('').replace(/&$/, "");
  },

  /**
   * Realiza uma requisição ajax do tipo "get", retornando texto.
   *    
   * @name get
   * @param {String}   url       URL a ser requisitada.
   * @param {Data}     data      Dados a serem enviados.
   * @param {Function} callback  Função de retorno.
   */
  get: function(url, data, callback) {
    var d = data || null, fn = callback || null;

    if ((typeof data == 'function') && (typeof callback == 'undefined')) {
      d = null;
      fn = data;
    }

    ajax.request({url: url, data: d, onSuccess: fn});
  },

  /**
   * Realiza uma requisição ajax do tipo "get", retornando JSON.
   *
   * @name getJSON
   * @param {String}   url       URL a ser requisitada.
   * @param {Data}     data      Dados a serem enviados.
   * @param {Function} callback  Função de retorno.
   */
  getJSON: function(url, data, callback) {
    var d = data || null, fn = callback || null;

    if ((typeof data == 'function') && (typeof callback == 'undefined')) {
      d = null;
      fn = data;
    }

    ajax.request({url: url, data: d, dataType: 'json', onSuccess: fn});
  },

  /**
   * Realiza uma requisição ajax do tipo "get", retornando XML.
   *
   * @name getXML
   * @param {String}   url       URL a ser requisitada.
   * @param {Data}     data      Dados a serem enviados.
   * @param {Function} callback  Função de retorno.
   */
  getXML: function(url, data, callback) {
    var d = data || null, fn = callback || null;

    if ((typeof data == 'function') && (typeof callback == 'undefined')) {
      d = null;
      fn = data;
    }

    ajax.request({url: url, data: d, dataType: 'xml', onSuccess: fn});
  },

  /**
   * Realiza uma requisição ajax do tipo "post".
   *
   * @name post
   * @param {String}   url       URL a ser requisitada.
   * @param {Data}     data      Dados a serem enviados.
   * @param {Function} callback  Função de retorno.
   */
  post: function(url, data, callback) {
    var d = data || null, fn = callback || null;

    if ((typeof data == 'function') && (typeof callback == 'undefined')) {
      d = null;
      fn = data;
    }

    ajax.request({url: url, type: 'post', data: d, onSuccess: fn});
  },

  /**
   * Carrega um script dinamicamente.
   *    
   * @name loadScript
   * @param {String}   url       URL do script.
   */
  loadScript: function(url) {
    var script = document.getElementById('dynamicScript');

    if (script)
      script.parentNode.removeChild(script);

    script = document.createElement('script');
    script.setAttribute('src', url);
    script.setAttribute('id', 'dynamicScript');
    script.setAttribute('type', 'text/javascript');
    document.documentElement.firstChild.appendChild(script);
  },

  /**
   * Carrega JSON remotamente (JSONP).
   *    
   * @name loadJSONP
   * @param {String}   url       URL dos dados.
   * @param {String}   jsonp     Nome da função de retorno do servidor. O 
   *                             padrão é "callback".
   * @param {Function} callback  Função de retorno.
   */
  loadJSONP: function(url, jsonp, callback) {
    var j = jsonp || 'callback', fn = callback || jProton.emptyFn,
        script = document.getElementById('dynamicScript');

    if ((typeof jsonp == 'function') && (typeof callback == 'undefined')) {
      j = 'callback';
      fn = jsonp;
    }

    if (script)
      script.parentNode.removeChild(script);

    ajax._callback = fn;
    script = document.createElement('script');
    script.setAttribute('src', url + '&'+ j + '=jProton.ajax._callback');
    script.setAttribute('id', 'dynamicScript');
    script.setAttribute('type', 'text/javascript');
    document.documentElement.firstChild.appendChild(script);
  }

  /**#@-*/
});
